package com.snda.sc.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 效验值生成工具。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">李曦</a><br/>
 *         Created at: 2012-9-27 下午4:31:18
 */
public abstract class Signs {

	/**
	 * 根据dict和secret生成效验值。
	 * 
	 * @param dict
	 *            参数列表
	 * @param secret
	 *            密钥
	 * @param secretFront
	 *            密钥是否放在在最前面，true表示密钥放在dict字符串前面，false表示密钥放在dict字符串后面
	 * @param filterSymbol
	 *            是否过滤掉“=”等特殊符号，true表示需要过滤掉特殊符号，false表示不需要
	 * @return
	 */
	public static String createSign(Map<String, String> dict, String secret, boolean secretFront, boolean filterSymbol) {
		StringBuilder sb = null;
		if (secretFront) sb = new StringBuilder(secret).append(sortDict(dict, filterSymbol));
		else sb = sortDict(dict, filterSymbol).append(secret);
		return CommonUtils.md5(sb.toString());
	}

	/**
	 * 根据dict和secret生成效验值。密钥排列在前面且需要过滤掉特殊符号。（如百度、边锋等平台的密钥使用这种生成方式）
	 * 
	 * @param dict
	 *            参数列表
	 * @param secret
	 *            密钥
	 * @return
	 */
	public static String createSignWithNoSymbolSecretFront(Map<String, String> dict, String secret) {
		return createSign(dict, secret, true, true);
	}

	/**
	 * 根据dict和secret生成效验值。密钥排列在后面且需要过滤掉特殊符号。（暂无实例）
	 * 
	 * @param dict
	 *            参数列表
	 * @param secret
	 *            密钥
	 * @return
	 */
	public static String createSignWithNoSymbolSecretBehind(Map<String, String> dict, String secret) {
		return createSign(dict, secret, false, true);
	}

	/**
	 * 根据dict和secret生成效验值。密钥排列在后面且不需要过滤掉特殊符号。（如HPS、人人等平台的密钥使用这种生成方式）
	 * 
	 * @param dict
	 *            参数列表
	 * @param secret
	 *            密钥
	 * @return
	 */
	public static String createSignWithSymbolSecretBehind(Map<String, String> dict, String secret) {
		return createSign(dict, secret, false, false);
	}

	/**
	 * 根据dict和secret生成效验值。密钥排列在前面且不需要过滤掉特殊符号。（暂无实例）
	 * 
	 * @param dict
	 *            参数列表
	 * @param secret
	 *            密钥
	 * @return
	 */
	public static String createSignWithSymbolSecretFront(Map<String, String> dict, String secret) {
		return createSign(dict, secret, true, false);
	}

	private static StringBuilder sortDict(Map<String, String> dict, boolean filterSymbol) {
		List<String> pairs = new ArrayList<>();
		for (Entry<String, String> entry : dict.entrySet()) {
			pairs.add(entry.getKey() + (filterSymbol ? "" : "=") + entry.getValue());
		}
		Collections.sort(pairs);

		StringBuilder sb = new StringBuilder();
		for (String pair : pairs)
			sb.append(pair);
		return sb;
	}
}
